# !/usr/bin/env python
# -*- coding: utf-8 -*-
# @File  : 分类评估方法-精确率、召回率、f1-score.py
# @Author: dongguangwen
# @Date  : 2025-02-06 21:50
import pandas as pd
from sklearn.metrics import confusion_matrix, precision_score, recall_score, f1_score

# 构建数据:真实值,预测值
# 样本集中共有6个恶性肿瘤样本, 4个良性肿瘤样本
y_true = ['恶性', '恶性', '恶性', '恶性', '恶性', '恶性', '良性', '良性', '良性', '良性']
# 1. 模型 A: 预测对了3个恶性肿瘤样本, 4个良性肿瘤样本
y_pre_A = ['恶性', '恶性', '恶性', '良性', '良性', '良性', '良性', '良性', '良性', '良性']
# 2. 模型 B: 预测对了6个恶性肿瘤样本, 1个良性肿瘤样本
y_pre_B = ['恶性', '恶性', '恶性', '恶性', '恶性', '恶性', '恶性', '恶性', '恶性', '良性']

# 混淆矩阵
A = confusion_matrix(y_true, y_pre_A, labels=['恶性', '良性'])
print(pd.DataFrame(A, columns=['恶性', '良性'], index=['恶性', '良性']))

B = confusion_matrix(y_true, y_pre_B, labels=['恶性', '良性'])
print(pd.DataFrame(B, columns=['恶性', '良性'], index=['恶性', '良性']))


# 精确率
print(precision_score(y_true, y_pre_A, pos_label='恶性'))
print(precision_score(y_true, y_pre_B, pos_label='恶性'))

# 召回率
print(recall_score(y_true, y_pre_A, pos_label='恶性'))
print(recall_score(y_true, y_pre_B, pos_label='恶性'))

# f1-score
print(f1_score(y_true, y_pre_A, pos_label='恶性'))
print(f1_score(y_true, y_pre_B, pos_label='恶性'))

"""
    恶性  良性
恶性   3   3
良性   0   4
    恶性  良性
恶性   6   0
良性   3   1
1.0
0.6666666666666666
0.5
1.0
0.6666666666666666
0.8
"""